//
//  ViewController.m
//  UI21_Block
//
//  Created by 李劲成 on 16/4/7.
//  Copyright © 2016年 ljc. All rights reserved.
//

#import "ViewController.h"

/** 函数的声明 */
int sum(int, int);

/** 函数的实现 */
int sum(int x, int y) {
    
    return x + y;
}

@interface ViewController ()

// 声明Block 属性, 语义设置使用 copy, copy 到堆区, 防止野指针.

@property (nonatomic, copy) NSString *(^handleString)(NSString *, NSString *);

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self reviewFunciton];
    [self chapterOfBlock];
    [self defineBlock];
    [self invokeBlock];
    // Do any additional setup after loading the view, typically from a nib.
}


#pragma mark - 复习函数
- (void)reviewFunciton {
    
    // 函数调用
    int sum1 = sum(3, 5);
    printf("sum:%d\n", sum1);
    
    // 函数指针. (技巧: 函数声明部分, 把函数名换成(*p));
    // 指针类型: int (*) (int, int)
    // 指针变量 p
    // 值: NULL.
    int (*p) (int, int) = NULL;
    
    p = sum;
    
    // 通过函数指针调用函数.
    int sumTwo = p(3, 5);
    printf("sumTwo:%d\n", sumTwo);
    
}

#pragma mark - 知识点:(Block)

/**
 * Block(块), 在其它编程语言中也有相似的概念, 叫闭包(closure)
 *
 * Block 和 函数指针非常相似 (技巧:(将(*p)) 换成 (^block))
 *
 * Block 本质是匿名函数.
 */
- (void)chapterOfBlock {
   // 声明一个 block 变量.
   // 类型: int(^)(int, int)
   // 变量名: handler
   int (^handler)(int, int) = NULL;
    
   // 赋值, 因为 Block 是匿名函数, 不能直接赋函数名, 直接赋实现部分.
    handler = ^(int x, int y){
        return x + y;
    };
    
    // 调用 Block
    int sumOfHandler = handler(3, 5);
    printf("sumOfHandler:%d\n", sumOfHandler);
    
    // 定义一个求两个整数乘积的 Block
    int (^handlerMul)(int, int) = ^(int x, int y) {
        return  x * y;
    };
    int sumOfMul = handlerMul(3, 5);
    printf("handlerMul:%d",sumOfMul);
    
    // 定义一个拼接两个字符串的 Block, (返回拼接之后的字符串)
    
    NSString *(^handlerString)(NSString *, NSString *) = ^(NSString *A, NSString *B) {
        
        return [A stringByAppendingString:B];
        
    };
    

    NSLog(@"%@", handlerString(@"Da", @"Lian"));


}


/** 定义 Block. */
- (void)defineBlock {
    self.handleString = ^(NSString *a, NSString *b) {
        return [a stringByAppendingString:b];
    };
}
/** 调用Block. */
- (void)invokeBlock {
    
    NSString *ab = self.handleString(@"Dl", @"lo");
    NSLog(@"%@", ab);
    
}











- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
